草庐IT

c++ - Lua C++ 表迭代

全部标签

python - 为什么 boost::python 迭代器会跳过第一个元素?

当我试图在C++中为Python实现可迭代对象(使用boost::python)时,我遇到了一个奇怪的问题。Python似乎总是取消引用前面的一个元素,因此,结果它跳过第一个元素并且还取消引用“结束”元素。我也不确定我的返回值策略是否正确选择,但如果我将int替换为std::string作为元素类型,它似乎是唯一可以正常工作的策略。特意选择了迭代器标记-我打算实现可迭代对象以访问只能遍历一次的资源。C++代码:#include#include#include#includeintnextInstance{0};classFoo{public:classiterator:publicst

c++ - unordered_map 相同键的迭代顺序

当遍历std::unordered_map时,STL不保证考虑哪个特定元素顺序。我的问题是关于具有相同键的元素的顺序,我用不同的编译器尝试过,如果它们具有相同的键,我总是一个接一个地收到(下面的示例)。我搜索了它,但找不到。它是在标准中的某处提到的还是依赖于实现的?unordered_multimapumap;umap.insert({30,9});umap.insert({10,1});umap.insert({20,5});umap.insert({30,8});umap.insert({20,4});umap.insert({10,2});for(autop:umap)cout输

c++ - 条件中的迭代器赋值 - vector 迭代器不兼容

我有一个用于std::vector的包装器,我已经实现了用另一个vector替换一个vector中的部分的函数。我试图将迭代器的赋值直接放在if条件中,但得到了意想不到的结果。我正在使用VisualStudio2013并且定义了FAIL我得到了DebugAssertionFailed!-vector迭代器不兼容。是否有可能从右到左评估条件?我无法克服它。这是一个(实现不佳的)代码,它重现了我的问题-旨在用vec_second的第一个和第二个元素替换vec的第3个和第4个元素:#include#include#includeusingstd::cout;//#defineFAILintm

c++ - 什么时候使用迭代器的 `value_type`?

我试图了解何时实际使用了iterator::value_type。因为,迭代器的所有运算符,似乎只使用iterator::pointer和iterator::reference。问题iterator::value_type是否真的用于某些事情?附加问题:迭代器是否继承自std::iterator提出一些语义问题?编辑:要理解我为什么问这个问题,是因为我正在为一种类型的迭代器工作,pointer和reference是代理类。 最佳答案 我可以考虑在通用代码中使用它。假设您在C++11中编写一个对范围求和的通用函数。你可以把它写成tem

c++ - 在双向迭代器上实现快速排序

使用具有O(NlgN)时间和O(lgN)空间的双向迭代器实现快速排序似乎非常简单。那么,std::sort()需要随机访问迭代器的特殊原因是什么?我已阅读有关该主题的文章whydostd::sortandpartial_sortrequirerandom-accessiterators?.但它没有解释可能的std::sort()实现的具体部分可能实际上需要随机访问迭代器来维持其时间和空间复杂度。O(NlgN)时间和O(lgN)空间的可能实现:templateBidirItpartition(BidirItfirst,BidirItlast,Predpred){while(true){w

c++ - vector 中的无效迭代器

我知道擦​​除会使删除点和删除点之后的迭代器失效。考虑:std::vectorvec={1,2,3,4,5};std::vector::iteratorit=vec.end()-1;//lastelementvec.erase(vec.begin());//shifteverythingonetotheleft,'it'shouldbethenew'end()'?std::cout比较(不是取消引用)无效的迭代器(在本例中为it)是否是未定义的行为?如果不是,it==vec.end()是否保证成立?编辑:如果只有它是一个奇异值,从最上面的答案看来这是UB。但是来自Whatissingu

c++ - 用于自追加的字符串反向迭代器的持久性

问题:假设我有一个字符串,我想生成一个新字符串,其中包含原始字符串及其反向连接。以下是否保证有效?autopq=[](std::string&s){s.reserve(2*s.size());s.append(s.rbegin(),s.rend());};我看到了reserve应该设置capacity适本地。但是,是否应用append反对反向迭代器会导致这些迭代器失效?其他背景:我的C++.11拷贝(与C++.17draft具有相同的语言),在§[string.capacity]中说voidreserve(size_typeres_arg=0);Thememberfunctionres

c++ - 通过 C++ 中的迭代器从 vector 中获取相邻的元素对

我想遍历vector中的所有相邻对元素。例如,如果我有一个vector{1,2,3,4},我希望我的迭代器返回以下内容:(1,2)(2,3)(3,4)我知道如何使用以下方法一次迭代一个元素:vectornumbers=={1,2,3,4};for(vector::const_iteratorit=numbers.cbegin();words!=numbers.cend();++it){cout但我也不知道如何获取下一个元素。 最佳答案 Vector的迭代器是randomaccessiterator.您可以在迭代器上使用operato

c++ - 在列表迭代期间删除元素 - 安全

我想知道这样的东西是否安全......//Iteratingthroughawhile(iter!=seq.end()){if(test){iter=seq.erase(iter);}else{++iter;}我知道以这种方式遍历vector会使迭代器失效,但同样的事情会发生在列表中吗?我假设不是,因为列表是通过指针顺序排列的,而不是在内存中彼此“相邻”,但任何保证都会有所帮助。 最佳答案 这很好,因为删除方法返回一个新的有效迭代器。 关于c++-在列表迭代期间删除元素-安全,我们在St

c++ - 具有派生类的自定义容器的迭代器

我有一个自定义容器,它以两种不同的方式实现,但只有一个界面。像这样的事情。classVector{virtualIteratorbegin()=0;virtualIteratorend()=0;...//somemorefunctions.};classVectorImplA:publicVector{Iteratorbegin(){returnm_data.begin();}Iteratorend(){returnm_data.end();}private:SomeFloatContainerm_data;};classVectorImplB:publicVector{Iterato